#!/usr/bin/env python
# # -*- coding: utf-8 -*-

"""
@File:      UnitCheckTool.py
@Author:    Jim.Dai.Cn
@Date:      2024/6/11 19:09
@Desc:         
"""

import urllib.parse
import json5
from qwen_agent.agents import Assistant
from qwen_agent.tools.base import BaseTool, register_tool
from DataWizards.tools.UnitCheckTool import *
from ..config.config import *


@register_tool('unit_check')
class UnitCheckTool(BaseTool):
    """
        单位检查错误：40.000000 元
        元与万元，以及元的精度情况
    """
    description = 'Units checking service, check if units is correct. Especially money units.'
    # The `parameters` tell the agent what input parameters the tool has.
    parameters = [{
        'name': 'prompt',
        'type': 'string',
        'description': 'Compare all the units of the amount and find the units with obvious problems',
        'required': True
    },
        {'name': 'all_money_data', 'type': 'string', 'description': 'The doc content used for analyse', 'required': True}]
    
    

    def call(self, params: str, **kwargs) -> str:
        str_path = json5.loads(params)['path_doc']
        # self.check_currency(all_money_data)
        all_money_data = self.getMoneyData(str_path)
        all_money_data_arr = self.money_data_formate(all_money_data)
        print('所有金额数组', all_money_data_arr)
        return self.check_unit(','.join(all_money_data_arr))
    
    # 将获取到的数据转为数组格式
    def money_data_formate(self, all_money_data) -> list:
        all_money_data_rmn = all_money_data.replace('\n', '')
        all_money_data_arr_rms = all_money_data_rmn.split('- "')
        all_money_data_arr = all_money_data_arr_rms[1:]
        return all_money_data_arr


    def getMoneyData(self, str_doc) -> list:
        bot = Assistant(llm=llm_cfg_llama_cpp_qwen2_7B,
                        system_message='你扮演一位专业的招标代理项目经理，请审核材料并只利用原文语句回答问题。',
                        function_list=['date_compare', 'code_interpreter'],
                        # files=['DataWizards/tools/rules/date.txt'])
                        files=[str_doc])
        # history = [{'role': 'user', 'content': '请问该文件内容涉及到的所有金额有哪些？请只使用原文语句回答问题，并使用数组的方式列举出来。'}]
        history = [{'role': 'user', 'content': '请问该文件内容涉及到金额的原文有哪些？请只使用原文语句回答问题并使用数组格式列举出来。'}]
        reply = []
        for response in bot.run(messages=history):
            reply.extend(response)
        tmp_result = reply[-1]['content']
        return tmp_result

# 对提取出的所有金额进行单位检查提问（效果不好）
    def check_unit(self, all_money_data) -> list:
        wrong_example_data = '10百元,10千元,100千元,10000万元,10百万元,100百万元,1000百万元'
        print('获取的所有金额', all_money_data)
        bot = Assistant(llm=llm_cfg_llama_cpp_qwen2_7B,
                        system_message='你扮演一位专业的招标代理项目经理，请检查给出内容的金额单位。'
                        )
        # history = [{'role': 'user', 'content': doubtful_data + '。请根据上述的错误示例，对比给出的金额：'+ all_money_data +'，请返回其中存在上述错误的内容。请只回答答案，例如：问题是文件名是什么？回答：文件全称，而不要回答：文件名是文件全称。'}]
        # history = [{'role': 'user', 'content': doubtful_data + '。请只根据上述的错误示例，对比给出的金额：'+ all_money_data +'，返回其中存在上述错误的内容。请只回答答案，例如：问题是文件名是什么？回答：文件全称，而不要回答：文件名是文件全称。'}]
        history = [{'role': 'user', 'content': wrong_example_data + '。请根据上述金额单位不合理的示例，忽略小数点后面的0，对比给出的金额：'+ all_money_data +'，返回给出金额中单位不合理的具体内容，如果没有不合理处请回答' '。请只回答答案，并且不要做其他描述。'}]
        reply = []
        for response in bot.run(messages=history):
            reply.extend(response)

        print('存在问题金额', reply[-1]['content'])
        return [reply[-1]['content']]
    
    # 比较大多数采用的单位，增加限制条件
    # def check_currency(self, all_money_data) -> list:
    #     # all_currency_data = '人民币,美元,欧元,英镑,港币,日元,韩元,澳元,台币,韩元,泰铢'
    #     bot = Assistant(llm=llm_cfg_llama_cpp_qwen2_7B,
    #                     system_message='你扮演一位专业的招标代理项目经理，请检查给出内容涉及的货币种类。',
    #                     )
    #     history = [{'role': 'user', 'content': all_money_data + '。请对比给出的金额数据，判断金额中货币种类或者货币单位使用不合理的内容并返回对应内容，如果没有则返回空。回答的格式只有原文或者''，不需要其他解释。'}]
    #     reply = []
    #     for response in bot.run(messages=history):
    #         reply.extend(response)
    #     print(333, reply[-1]['content'])
    #     return reply[-1]['content']